public class Postfix extends Stack_Abstracto <Integer>{

	/**
	 * Atributos de la clase
	 */
	private String expresion;
	
	
	/**
	 * Constructor de la clase
	 * inicializa los atributos de la clase abstracta de la que hereda
	 */
	public Postfix()
	{
		
		datos=new Lista<Integer>();
		
	}
	
	
	/**
	 * Método que introduce en el stack y calcula
	 * la expresión que se encuentra en el atributo
	 * expresión.
	 */
	public void meterStack()
	{
		
		char c;
		String s;
		
		for(int i=0;i<expresion.length();i++)
		{
			c=expresion.charAt(i);
			if((c=='*')||(c=='+')||(c=='-')||(c=='/'))
			{
				calcular(c);
			}
			else
			{	s=""+c;
				push(Integer.parseInt(s));
			}
		}
		
		
	}
	
	/**
	 * Método que devuelve el resultado despues de haber
	 * calculado la expresión.
	 * @return
	 */
	public Integer resultado()
	{
		return pop();
	}
	
	
	/**
	 * Método que indica la expresion que se colocara en el stack
	 * @param expresion
	 */
	public void setExpresion(String expresion)
	{
		this.expresion=expresion;
	}


	/**
	 * Método de soporte que sirve para hacer las operaciones
	 * correspondientes con los valores dentro del stack.
	 * @param signo
	 */
	private void calcular(char signo)
	{
		
		Integer a,b;
		
		switch(signo)
		{
		case '+':
			a=pop();
			b=pop();
			System.out.println(""+a+b);
			if((a==null)||(b==null))
				push(null);
			else
				push(a+b);
			break;
		case '*':
			a=pop();
			b=pop();
			if((a==null)||(b==null))
				push(null);
			else
				push(a*b);
			break;
		case '-':
			a=pop();
			b=pop();
			if((a==null)||(b==null))
				push(null);
			else
				push(b-a);
			break;
		case '/':
			a=pop();
			b=pop();
			if((a==null)||(b==null)||(a==0))
				push(null);
			else
				push(b/a);
			break;
		}
		
	}
	
	
	
}
